//package cn.zhuama.common.component;
//
//import cn.zhuama.basic.annotation.PreAuthorize;
//import cn.zhuama.basic.util.AjaxResult;
//import cn.zhuama.org.domain.Logininfo;
//import cn.zhuama.org.mapper.EmployeeMapper;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Component;
//import org.springframework.web.method.HandlerMethod;
//import org.springframework.web.servlet.HandlerInterceptor;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.PrintWriter;
//import java.util.List;
//import java.util.concurrent.TimeUnit;
//
//@Component
//public class LoginInterceptor implements HandlerInterceptor {
//    @Autowired
//    RedisTemplate redisTemplate;
//    @Autowired
//    EmployeeMapper employeeMapper;
//    @Override
//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        //拦截器业务代码
//        //得先获取token
//        String token = request.getHeader("token");
//        //就是你登录界面过了 想进去index了 那就得来这一层被判断一下能否进去 相当于最后一道门槛 其实在service中也可以实现
//        //判断请求体 头是否带有token 带有token的话 想拿数据到前端 数据保存在本地redis中 媒介就是token 对应的 Object
//        if(request.getHeader("token")!=null){
//        //有token就拿数据 这里要设置个时效吧 三分钟 会刷新token 不然会一直存在
//            Object obj=redisTemplate.opsForValue().get(request.getHeader("token"));
//            //Object obj= redisTemplate.opsForValue().get(token); 一样的
//            if(obj!=null) {//登陆成功也拿到数据了 没有过期 这边说是要重新刷新下时间 就是要个三十分钟 这三十分钟拦截器不会管你
//                redisTemplate.opsForValue().set(request.getHeader("token"), obj, 30, TimeUnit.MINUTES);
//                //校验权限
//                //有数据第一步要判断 登陆成功这个用户信息的类型是不是用户 是用户放行 不是的话拦截进行判断
//                Logininfo log = (Logininfo) obj;
//                if (log.getType() == 1) {
//                    //用户 直接放行
//                    return true;
//                }
//                //获取打了自定义注解中的方法  这步应该是获取所有方法
//                HandlerMethod handlerMethod = (HandlerMethod) handler;
//                //获取打了PreAuthoorize注解下的方法
//                PreAuthorize preAuthorize = ((HandlerMethod) handler).getMethodAnnotation(PreAuthorize.class);
//                //如果 这个preAuthorize为空 说明没有方法有注解 也就是说 不需要权限 直接放行 如果不匹配 则说明是公共资源
//                if (preAuthorize == null) {
//                    //没有放行 公共资源
//                    return true;
//                } else {
//                    //不为空 说明该方法上加了注解 特殊资源需要检验权限
//                    //那就进行判断 获取注解上的value值
//                    String sn = preAuthorize.value();
//                    //找到这个value 判断登录用户是否有权限判定、
//                    List<String> ownPermission = employeeMapper.loadPerssionSnByLogininfoId(log.getId());
//                    //sb采用for循环这里直接用是否包含就可以
//                    if (ownPermission.contains(sn)) {
//                        //有的话 直接放行
//                        return true;
//                    } else {
//                        //没有 则说明没有权限 提示去管理员哪里获得权限
//                        //这里好像要跳前端 这段是复制的 意思是 用输出流在前端写东西
//                        response.setCharacterEncoding("UTF-8");
//                        response.setContentType("application/json;charset=utf-8");
//                        PrintWriter writer = response.getWriter();
//                        writer.print("{\"success\":false,\"message\":\"noPermission\"}");
//                        writer.close();
//                        return false;
//
//                    }
//                }
//            }
//
//         //没拿到 登录不成功 说明过期了 token中没东西 就重新回去拿 跳转到登录界面重新拿 跟后面一样 不用单独返回
//        }
//        //都到了这步肯定就是token没东西 那得去登录界面重新来一遍
//        //看了文档 发现个问题 就是你后端可以放行 和拦截 但是没有直接跳转的能力 所以要放在前端跳转 我理解就是返回一个Ajex JSON 然后让前端接受跳转
//       // response.setContentType("application/json;charset=UTF-8");
//        //"successs":false,"message":noLogin 相当于写了一个两个key value 对应的JSON 给axios的后置拦截器 作判断了
//        response.setContentType("application/json;charset=UTF-8");
//        response.getWriter().println("{\"success\":false,\"message\":\"noLogin\"}");
//        return false;
//    }
//}